<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>判断数据类型</title>
</head>
<body>
<script>
    /*
        toString() 方法返回一个表示该对象的字符串。
        每个对象都有一个 toString() 方法，当对象被表示为文本值时或者当以期望字符串的方式引用对象时，该方法被自动调用。默认情况下，toString() 方法被每个继承自Object的对象继承。如果此方法在自定义对象中未被覆盖，toString() 返回 "[object type]",其中type是对象类型。

    网址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
    使用toString()方法来检测对象类型
    可以通过toString() 来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString() 来检测，需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用，把需要检测的对象作为第一个参数传入。
    var toString = Object.prototype.toString;

    toString.call(new Date); // [object Date]
    toString.call(new String); // [object String]
    toString.call(Math); // [object Math]

    toString.call(undefined); // [object Undefined]
    toString.call(null); // [object Null]
*/
    console.log(213 == null)
var a = [] ;
console.log(type(a))
function type(elem) {
    if(elem == null) {
        return elem + '';
    }
    return Object.prototype.toString.call(elem).replace(/[\[\]]/g, '').split(' ')[1].toLowerCase();
}
/*
覆盖(遮蔽)默认的toString方法
可以自定义一个方法来取代默认的 toString() 方法。该 toString() 方法不能传入参数并且必须返回一个字符串。自定义的toString()方法可以是任何我们需要的值，但如果它附带有关对象的信息，它将变的非常有用。

在下面的代码中，定义了一个 Dog  对象数据类型，并且创建了该对象的一个实例：
*/
function Dog(name,breed,color,sex) {
   this.name=name;
   this.breed=breed;
   this.color=color;
   this.sex=sex;
}
Dog.prototype.toString = function dogToString(){
    var ret = "Dog " + this.name + " is a " + this.sex + " " + this.color + " " + this.breed;
    return ret;
}
var theDog = new Dog("Gabby","Lab","chocolate","female");
console.log(theDog.toString())
/*
instanceof 运算符用于判断一个变量是否为一个对象的实例。在这里，arr 是 Array 对象的一个实例，所以 arr instanceof Array 会返回 true ，从而我们知道变量 arr 是一个数组。
*/
var b = [];
console.log(b instanceof Array)
</script>
</body>
</html>